package Bubble;

/*
       快速排序：
           第一轮：以0索引的数字为基准数，确定基准数在数组中正确的位置。
           比基准数小的全部在左边，比基准数大的全部在右边。
           后面以此类推。
     */
public class demo4 {
    public static void main(String[] args) {
        int[] arr = {6, 2, 7, 9, 3, 4, 5, 1, 10, 8};


        qsort(arr, 0, arr.length - 1);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }

    /*
     *   参数一：我们要排序的数组
     *   参数二：要排序数组的起始索引
     *   参数三：要排序数组的结束索引
     * */
    public static void qsort(int[] arr, int i, int j) {

        //定义两个变量记录要查找的范围
        int start = i;
        int end = j;
        if(start > end){
            //递归的出口
            return;
        }
        //定义基准数
        int baseNumber = arr[i];

        while (start != end) {
            //利用end，从后往前走,找到基准数小的就停下
            while (true) {
                if (end <= start || arr[end] < baseNumber) {
                    break;
                }
                end--;
            }
            //利用start，前往后走,找到基准数大的就停下
            while (true) {
                if (end <= start || arr[start] > baseNumber) {
                    break;
                }
                start++;
            }
            //交换end和start所指向的数
            int tmp = arr[start];
            arr[start] = arr[end];
            arr[end] = tmp;
        }
        //当start和end指向了同一个元素的时候，那么上面的循环就会结束
        //表示已经找到了基准数在数组中应存入的位置
        //基准数归位
        //就是拿着这个范围中的第一个数字，跟start指向的元素进行交换
        int tmp = arr[i];
        arr[i] = arr[start];
        arr[start] = tmp;

        //确定6左边的范围，重复刚刚所做的事情
       qsort(arr, i, start - 1);

        //确定6右边的范围，重复刚刚所做的事情
        qsort(arr,start + 1,j);
    }
}
